/** 枚举时间梯度，减少计算压力 */
export const enum TimeStair {
    /** 毫秒 */
    ms = 1,
    /** 秒 */
    s = 1000,
    /** 分 */
    m = 60000,
    /** 小时 */
    h = 3600000,
    /** 天 */
    d = 86400000
}

/** 格式化一些样式 */
export default class FormatExt {

    /**
     * 数字前部补0对齐
     * 备注：(浮点数的小数点，也算作1位)
     * @param num 原始数值
     * @param len 需要对齐的位数
     */
    static alignZero(num: number, len: number): string {
        return (Array(len).join("0") + num).slice(-len);
    }

    /**
     * 格式化日期字符串
     * @param time 时间戳(ms)
     * @param format 格式化样式
     * @returns
     */
    static formatDate(time: string | number | null, format?: string): string {
        const date = !time ? new Date() : new Date(time);
        const obj = {
            YYYY: date.getFullYear(),
            MM: ("0" + (date.getMonth() + 1)).slice(-2),
            DD: ("0" + date.getDate()).slice(-2),
            HH: ("0" + date.getHours()).slice(-2),
            mm: ("0" + date.getMinutes()).slice(-2),
            ss: ("0" + date.getSeconds()).slice(-2),
            YY: ("" + date.getFullYear()).slice(-2),
            M: date.getMonth() + 1,
            D: date.getDate(),
            H: date.getHours(),
            m: date.getMinutes(),
            s: date.getSeconds(),
        };
        Object.keys(obj).forEach((key) => {
            format = format.replace(key, obj[key]);
        });
        return format;
    }

    /**
     * 格式化倒计时格式
     * 'HH:mm:ss' | 'mm:ss' | 'ss'
     * @param leftMSec 剩余毫秒数
     */
    static formatTimer(leftMSec: number, format: string = "HH:mm:ss"): string {
        // 3：'时分秒'样式；2:'分秒'样式；1：'秒'样式
        const style = format.indexOf("H") == 0 ? 3 : format.indexOf("m") == 0 ? 2 : 1;
        // 格式化结构体
        let obj;
        if (style == 1) {
            // '秒'样式
            const sec = Math.floor(leftMSec / TimeStair.s);
            obj = {
                ss: sec < 10 ? ("0" + sec).slice(-2) : sec,
                s: sec,
            };
            Object.keys(obj).forEach((key) => {
                format = format.replace(key, obj[key]);
            });
        } else if (style == 2) {
            // '分秒'样式
            const min = Math.floor(leftMSec / TimeStair.m);
            const sec = Math.floor((leftMSec - min * TimeStair.m) / TimeStair.s);
            obj = {
                mm: min < 10 ? ("0" + min).slice(-2) : min,
                m: min,
                ss: sec < 10 ? ("0" + sec).slice(-2) : sec,
                s: sec,
            };
            Object.keys(obj).forEach((key) => {
                format = format.replace(key, obj[key]);
            });
        } else if (style == 3) {
            // '时分秒'样式
            const hou = Math.floor(leftMSec / TimeStair.h);
            const min = Math.floor((leftMSec - hou * TimeStair.h) / TimeStair.m);
            const sec = Math.floor((leftMSec - hou * TimeStair.h - min * TimeStair.m) / TimeStair.s);
            obj = {
                HH: hou < 10 ? ("0" + hou).slice(-2) : hou,
                H: hou,
                mm: min < 10 ? ("0" + min).slice(-2) : min,
                m: min,
                ss: sec < 10 ? ("0" + sec).slice(-2) : sec,
                s: sec,
            };
            Object.keys(obj).forEach((key) => {
                format = format.replace(key, obj[key]);
            });
        }
        return format;
    }
}